package rmi;

import interfaces.InterfazRemota;

import java.io.File;
import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.List;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

import dominio.bean.CodigoPostal;
import dominio.bean.DetalleLiquidacion;
import dominio.bean.EmpresaTransporte;
import dominio.bean.FormularioCompraProductoId;
import dominio.bean.FormularioCompraProductos;
import dominio.bean.Liquidacion;
import dominio.bean.Peso;
import dominio.bean.Producto;
import dominio.bean.SubClase;
import dominio.bean.Tarifa;
import dominio.dao.HibernateDAO;

public class AdministracionRecursos  extends UnicastRemoteObject implements InterfazRemota {

	private static final long serialVersionUID = 1L;
	private HibernateDAO dao;

	public AdministracionRecursos() throws RemoteException {
		super();
		// TODO Auto-generated constructor stub
		dao=HibernateDAO.getInstancia();
	}

	@Override
	public HashSet<Tarifa> getTarifas() throws RemoteException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void setTarifa(HashSet<Tarifa> tarifa) throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void addTarifa(Tarifa tarifa) throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean removerTarifa(Tarifa tarifa) throws RemoteException {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void persistirTarifa() throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Tarifa recuperarTarifa(Integer idEmpresaTransporte, String codigoPostal, Integer sector) throws RemoteException {
		// TODO Auto-generated method stub
		return dao.obtenerTarifaByIdentificador(idEmpresaTransporte, codigoPostal, sector);
	}

	@Override
	public HashSet<SubClase> getSubClases() throws RemoteException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void setSubClase(HashSet<SubClase> subClase) throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void addSubClase(SubClase subClase) throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean removerSubClase(SubClase subClase) throws RemoteException {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void persistirSubClase() throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void recuperarSubClase() throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public HashSet<Peso> getPesos() throws RemoteException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void setPeso(HashSet<Peso> peso) throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void addPeso(Peso peso) throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean removerPeso(Peso peso) throws RemoteException {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void persistirPeso() throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void recuperarPeso() throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public HashSet<EmpresaTransporte> getEmpresasDeTransportes()
			throws RemoteException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void setEmpresaDeTransporte(HashSet<EmpresaTransporte> emp)
			throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void addEmpresaDeTransporte(EmpresaTransporte emp)
			throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean removerEmpresaDeTransporte(EmpresaTransporte emp)
			throws RemoteException {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void persistirEmpresaDeTransporte() throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void recuperarEmpresaDeTransporte() throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public HashSet<CodigoPostal> getCodigosPostales() throws RemoteException {
		// TODO Auto-generated method stub
		try{
			return dao.obtenerCodigosPostales();
		}
		catch (Exception ex){
			ex.printStackTrace();		
		}
		return null;
	}

	@Override
	public void setCodigoPostal(HashSet<CodigoPostal> codigoPostal)
			throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void addCodigoPostal(CodigoPostal codigoPostal)
			throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean removerCodigoPostal(CodigoPostal codigoPostal)
			throws RemoteException {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void persistirCodigoPostal() throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public CodigoPostal recuperarCodigoPostal(String idCodigoPostal, Integer sector)throws RemoteException {
		// TODO Auto-generated method stub
		try{
			return dao.obtenerCodigoPostal(idCodigoPostal, sector);
		}
		catch (Exception ex){
			ex.printStackTrace();		
		}
		return null;
	}

	@Override
	public HashSet<FormularioCompraProductos> procesarPlanillaBase(File planillaBase) throws RemoteException {
		/*Este metodo recibira el archivo excel abierto previamente 
		El archivo debe estar igual a lo establecido en los requerimientos analizados*/
		HashSet<FormularioCompraProductos> formularios = new HashSet<FormularioCompraProductos>();
		
		try {
			// Obtengo el archivo seleccionado			
			Workbook workbook = Workbook.getWorkbook(planillaBase);
			
			//Comienzo a recorrer el excel por la primer hoja que encuentra
			for	(int nroHoja = 0 ; nroHoja < workbook.getNumberOfSheets() ; nroHoja++)
			{
				Sheet hoja = workbook.getSheet(nroHoja);
				int filas = hoja.getRows();
				int	columnaNroFormularioCompra;
				int	columnaNroItem;
				int	columnaFechaEstado;
				int	columnaRutCliente;
				int	columnaNombreCliente;
				int columnaRetiraCliente;
				int	columnaSectorReparto;
				int	columnaCodigoPostal;
				int	columnaNroProducto;
				int columnaRutTrans;				
				int columnaPatente;
				
				// Asigno el nro de columna por el titulo de la misma
				columnaNroFormularioCompra		= hoja.findLabelCell("Nro F12").getColumn();
				columnaNroItem					= hoja.findLabelCell("Item").getColumn();
				columnaFechaEstado				= hoja.findLabelCell("Fecha Estado").getColumn();
				columnaRutCliente				= hoja.findLabelCell("Rut Cliente").getColumn();
				columnaNombreCliente			= hoja.findLabelCell("Nombre Cliente").getColumn();
				columnaRetiraCliente			= hoja.findLabelCell("Retira Cliente de Bodega S/N").getColumn();
				columnaSectorReparto			= hoja.findLabelCell("Sector Reparto").getColumn();
				columnaCodigoPostal				= hoja.findLabelCell("Codigo Postal").getColumn();
				columnaNroProducto				= hoja.findLabelCell("Nro. Producto").getColumn();
				columnaRutTrans					= hoja.findLabelCell("Rut Trans").getColumn();
				columnaPatente					= hoja.findLabelCell("Patente").getColumn();
				
				for(int fila = 1 ; fila < filas ; fila ++) {
							
					FormularioCompraProductos formulario = new FormularioCompraProductos();
					
					String codPostal= hoja.getCell(columnaCodigoPostal, fila).getContents();
					Integer sector=Integer.parseInt(hoja.getCell(columnaSectorReparto, fila).getContents());
					CodigoPostal codigoPostal=dao.obtenerCodigoPostal(codPostal, sector);
					
					//Solo si existe el codigo postal lo agrego
					if (codigoPostal!=null){
						String retiraSiONo = hoja.getCell(columnaRetiraCliente, fila).getContents();
						Boolean retiraCliente=(retiraSiONo.equals("S"));
						
						//Si no lo retira el cliente entonces se liquida
						if (!retiraCliente){
							//Identificador de Formulario de Compra
							FormularioCompraProductoId formularioCompraId=new FormularioCompraProductoId();
							Integer nroFormularioCompra=Integer.parseInt(hoja.getCell(columnaNroFormularioCompra, fila).getContents());
							Integer nroItem=Integer.parseInt(hoja.getCell(columnaNroItem, fila).getContents());
							formularioCompraId.setIdFormularioCompra(nroFormularioCompra);
							formularioCompraId.setIdItem(nroItem);
							formulario.setIdFormulario(formularioCompraId);
							
							//Fecha de Estado
							SimpleDateFormat fecha = new SimpleDateFormat("dd/MM/yyyy");
							Date fechaEstado = null;
							try{
								String fechaEst = hoja.getCell(columnaFechaEstado, fila).getContents();
								fechaEstado = fecha.parse(fechaEst);
							}
							catch(ParseException ex){
								ex.printStackTrace();
							}
							fecha.format(new Date());
							formulario.setFechaEstado(fechaEstado);
							
							//Dni Cliente
							Integer dniCliente = Integer.parseInt(hoja.getCell(columnaRutCliente, fila).getContents());
							formulario.setDniCliente(dniCliente);
							
							//Nombre del Cliente
							String nombreCliente = hoja.getCell(columnaNombreCliente, fila).getContents();
							formulario.setNombreCliente(nombreCliente);
													
							//Retira Cliente
							formulario.setRetiraCliente(retiraCliente);
							
							//Codigo Postal
							formulario.setCodigoPostal(codigoPostal);
							
							//Producto
							Integer nroProducto= Integer.parseInt(hoja.getCell(columnaNroProducto, fila).getContents());
							Producto producto=dao.obtenerProducto(nroProducto);
							formulario.setProducto(producto);
							
							//Empresa de Transporte
							String cuit=hoja.getCell(columnaRutTrans,fila).getContents();
							EmpresaTransporte empresaTransporte=dao.obtenerEmpresaTransporteByCUIT(cuit);
							formulario.setEmpresaTransporte(empresaTransporte);
							
							//Patente
							String patente = hoja.getCell(columnaPatente, fila).getContents();
							formulario.setPatenteTransporte(patente);
							
							//Liquidado, en principio va en false porque recien se cargan los datos
							formulario.setLiquidado(true);
							
							formularios.add(formulario);
						}
					} 
					
					//insertar todos los formularios a la base de  datos
					dao.grabarFormularioCompraProductos(formularios);
				}
			}  
		} catch (BiffException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		return formularios;
	}

	@Override
	public Integer grabarLiquidacion(Liquidacion liquidacion)
			throws RemoteException {
		// TODO Auto-generated method stub
		try{
			return dao.grabarLiquidacion(liquidacion);
		}
		catch (Exception ex){
			ex.printStackTrace();
			return null;
		}		
	}

	@Override
	public void grabarDetallesLiquidacion(
			List<DetalleLiquidacion> detallesLiquidacion)
			throws RemoteException {
		// TODO Auto-generated method stub
		try{
			dao.grabarDetalleLiquidaciones(detallesLiquidacion);
		}
		catch (Exception ex){
			ex.printStackTrace();		
		}
	}

	@Override
	public void actualizarLiquidacion(Liquidacion liquidacion)
			throws RemoteException {
		// TODO Auto-generated method stub
		try{
			dao.modificarLiquidacion(liquidacion);
		}
		catch (Exception ex){
			ex.printStackTrace();		
		}
	}

	@Override
	public Liquidacion obtenerLiquidacion(Integer idLiquidacion)
			throws RemoteException {
		// TODO Auto-generated method stub
		try{
			return dao.obtenerLiquidacion(idLiquidacion);
		}
		catch (Exception ex){
			ex.printStackTrace();		
		}
		return null;
	}

	@Override
	public HashSet<DetalleLiquidacion> obtenerDetallesLiquidacion(
			Integer idLiquidacion) throws RemoteException {
		// TODO Auto-generated method stub
		try{
			return dao.obtenerDetallesLiquidacion(idLiquidacion);
		}
		catch (Exception ex){
			ex.printStackTrace();		
		}
		return null;
	}

	
}
